#include<iostream>
#include<cstring>
using namespace std;

//类型模版参数
template<class T>
class A{};

//非类型模版参数,N是常量,只能是int、long、char、size_t类型
//用处：定长的数组
template<class T , int N>
class Array{
public:

private:
	T _a[N];
};

//非类型模版参数测试
void test1(){
	Array<int, 100> a1;
	Array<int, 1000> a2;
}

//模版的特化——针对某些类型的特殊化处理
template<class T>
bool IsEqual(const T& left,const T& right){
	return left == right;
}
//特化
// 特化
template<>
bool IsEqual<const char*&>(const char*& left, const char*& right) {
    cout << "IsEqual的char*特化" << endl;
    return strcmp(left, right) == 0;
}

void test2(){
	int a = 0,b = 1;
	cout << IsEqual(a, b) << endl;
	char* p1 = "1";
	char* p2 = "1";
	//两个字符串比较不能使用==，否则比的就是指针的地址了
	cout << IsEqual(p1, p2) << endl;
}

//类的特化
template<class T>
class Date
{
private:
	T t;
public:
	Date(){
		cout <<"原版"<<endl;
	}
};

template<>
class Date<int>
{
private:
	int t;
public:
	Date(){
		cout <<"特化"<<endl;
	}
};

void test3()
{
	Date<double> d1;
	Date<int> d2;
}

int main(){
	//test1();
	//test2();
	test3();
	return 0;
}